home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / compuserve-file-archive / 05 Programming / 65816.TXT < prev    next >
Text File  |  2019-04-13  |  5KB  |  124 lines

  1.  
  2. Here Follows a Brief Description of the 65816 Microprocessor.
  3.  
  4. The 65C816 contains the following registers:
  5.  
  6. One 16 bit Accumulator             A
  7. One 16 bit Index Register          X
  8. One 16 bit Index Register          Y
  9. One 16 bit Stack Pointer           S
  10. One 16 bit Program Counter         PC
  11. One Processor Status Register      P
  12. One 16 bit Direct Page             D
  13. One 8 bit Data Bank Register       DBR
  14. One 8 bit Program Bank Register    PBR
  15.  
  16.  
  17. *** Special Notes for 16 bit Mode ***
  18.  
  19. The Program Bank Register is used in conjunction with PC to decide which
  20. of the 256 possible banks your code is located in.
  21.  
  22. The Data Bank Register is used in conjunction with either of the index
  23. registers X or Y to denote a high order 8 bit offset. It is not used
  24. with the Accumulator.
  25.  
  26. The Processor sees the Stack only in Zero Bank (i.e.,) the highest 8 bits
  27. of the 24 address lines are zeroed out when the Stack is accessed).
  28.  
  29. The Direct Page Register is used for adjusting where Zero Page will be
  30. found in the given 64K Bank. The Effective Address is arrived at by adding
  31. the argument of the opcode to D and then zeroing out the high order bits
  32. 16 through 23. That way no matter what value is in Direct Page Register,
  33. the resulting Effective Address will remain in the same Bank that you
  34. started with; that is, there's no wrapping over Bank Boundaries.
  35.  
  36.  
  37. *** Processor Status Register ***
  38.  
  39.  Bit  Significance   Flag   The Easy Way of Checking
  40.   0      Carry        C     (test by BCC or BCS)
  41.   1   Zero/Equality   Z     (test by BNE or BEQ)
  42.   2     Interrupt     I     PHP PLA AND #$02 (test by BNE or BEQ)
  43.   3      Decimal      D     PHP PLA AND #$04 (test by BNE or BEQ)
  44.   4    Index Width    X     PHP PLA AND #$08 (test by BNE or BEQ)
  45.   5    Accum Width    M     PHP PLA AND #$10 (test by BNE or BEQ)
  46.   6     Overflow      V     PHP PLA BIT #$40 (test by BNE, BEQ, BVC, BVS)
  47.   7   Minus/Negation  N     (test by BPL or BMI)
  48.   8   Emulation Flag  E     XCE (then test by BCC or BCS)
  49.  
  50.  
  51. *** 8 Bit Mode ***
  52.  
  53. By adjusting certain bits of the processor status register you can toggle
  54. A, X, or Y from 8 bit mode to 16 bit mode.
  55.  
  56. When Bit M = 1 the Accumulator will behave in truncated 8 Bit Mode and the
  57. high byte of the Accumulator (called "Accumulator B") will remain untouched
  58. by Accumulator operations.
  59.  
  60. When Bit M = 0 the Accumulator will behave in "long" 16 bit mode. Additions,
  61. subtractions, shifts, and rotates will involve both low and high bytes.
  62.  
  63. In either case, the low and high bytes of Accumulator may be swapped by
  64. employing the XBA instruction.  There do not seem to be any instructions
  65. for loading, storing, or otherwise independently manipulating Accumulator
  66. "B" save by swapping it down to the low byte position.
  67.  
  68. When Bit X = 1 both of the index Registers X and Y will behave in short 8
  69. Bit Mode.  The High Bytes will remain untouched and unaltered.
  70.  
  71. When Bit X = 0 both of the index Registers X and Y will behave in long 16
  72. Bit Mode.  That is, instructions like INX or DEX will involve both bytes
  73. of the index registers.
  74.  
  75.  
  76. *** Emulation Mode ***
  77.  
  78. The main purpose for the Emulation bit of the 65C816 mpu is for providing
  79. an enhanced degree of compatibility with the old NMOS 6502. That is,
  80. instruction timings are identical to that of the 6502. System interrupts
  81. are driven by the old regular 6502 hardware vectors that we have all come
  82. to love and hate. It is interesting that one of the tricks of playing with
  83. the 65C816 would be to avoid COP and ABORT interrupts by going into
  84. Emulation (E=1) mode.
  85.  
  86. Apparently there is no reduction in the 65C816 instruction set when toggling
  87. the Emulation Bit; all the regular instructions remain available-  It is
  88. only in the timing of the cycles, and the processing of interrupts, that
  89. things will differ.
  90.  
  91.  
  92. *** Incompatibilities ***
  93.  
  94. The 65C816 does not contain the 65C02 instructions SMB (Set Memory Bit),
  95. RMB (Clear or Reset Memory Bit), BBR (Branch on Bit Reset), or BBS
  96. (Branch on Bit Set).
  97.  
  98. The BRK software interrupt will use either vector $FFFE or $FFF6 depending
  99. on whether Emulation Bit is Clear or Set, respectively.
  100.  
  101. The 65C816 will write (i.e., corrupt) a series of bytes on system RESET
  102. by saving PBR, PC high, PC low, Processor Status on Stack somewhere in
  103. Bank Zero.  The 6502 does not save any information on stack at RESET.
  104. Since the high byte of stack pointer is cleared to one on RESET, we might
  105. assume that the data is written to an unpredictable range in page one(?)..
  106. On the other hand, we might further expect RESET (with E=1) to behave
  107. properly and refrain from saving registers on stack.
  108.  
  109. JMP Indirect on a page boundary works properly, unlike 6502.
  110.  
  111. Unimplemented 6502 opcodes behave as the Implemented 65816 opcodes.
  112.  
  113. Logical Flags are valid even in Decimal Mode.  [Hmmmm. Gonna have to try
  114. that one out!]
  115.  
  116. Extra Memory Read on page boundary fetches last byte read, not spurious
  117. byte.  This relates to data latching, and is of concern when writing to
  118. I/O peripherals that are sensitive to read's and write's... Since I'm
  119. not much of a hardware hacker, I won't dwell on this point.  Apparently
  120. it is of some concern when you do stuff like LDA (pointer),y when low byte
  121. of pointer is $ff...
  122.  
  123. Matthew Montchalin 73517,1042
  124.